package com.kenliang.javase.collection;

/**
 * @author KenLiang
 * @description:
 * ConcurrentHashMaps
 *  * jdk1.7分段锁的实现
 *  * 和hashmap一样，在jdk1.7中ConcurrentHashMap的底层数据结构是数组加链表。和hashmap不同的是ConcurrentHashMap中存放的数据是一段段的，即由多个Segment(段)组成的。每个Segment中都有着类似于数组加链表的结构。
 *  *
 *  * 关于Segment
 *  * ConcurrentHashMap有3个参数：
 *  *
 *  * initialCapacity：初始总容量，默认16
 *  * loadFactor：加载因子，默认0.75
 *  * concurrencyLevel：并发级别，默认16
 *  * 其中并发级别控制了Segment的个数，在一个ConcurrentHashMap创建后Segment的个数是不能变的，扩容过程过改变的是每个Segment的大小。
 *  *
 *  * 关于分段锁
 *  * 段Segment继承了重入锁ReentrantLock，有了锁的功能，每个锁控制的是一段，当每个Segment越来越大时，锁的粒度就变得有些大了。
 *  *
 *  * 分段锁的优势在于保证在操作不同段 map 的时候可以并发执行，操作同段 map 的时候，进行锁的竞争和等待。这相对于直接对整个map同步synchronized是有优势的。
 *  * 缺点在于分成很多段时会比较浪费内存空间(不连续，碎片化); 操作map时竞争同一个分段锁的概率非常小时，分段锁反而会造成更新等操作的长时间等待; 当某个段很大时，分段锁的性能会下降。
 *  *
 *  *
 *  *
 *  * jdk1.8实现
 *  * ConcurrentHashmap采用的底层数据结构为数组+链表+红黑树的形式。数组可以扩容，链表可以转化为红黑树。使用cas+synchronized实现同步
 *  * 当链表中元素个数超过默认设定（8个），当数组的大小还未超过64的时候，此时进行数组的扩容，如果超过则将链表转化成红黑树
 * @date Created in 7:07 PM 2020/11/3.
 */
public class ConcurrentHashMapTest {
}
